/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.financeiro.view;

import br.jm.financeiro.base.eao.EaoException;
import br.jm.financeiro.datamodel.LazyOrgaoDocumento;
import br.jm.financeiro.entity.OrgaoDocumento;
import br.jm.financeiro.entity.OrgaoDocumentoLista;
import br.jm.financeiro.entity.TipoDocumento;
import br.jm.financeiro.sistema.eao.OrgaoDocumentoEao;
import br.jm.financeiro.sistema.eao.OrgaoDocumentoListaEao;
import br.jm.financeiro.sistema.eao.TipoDocumentoEao;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.primefaces.model.DualListModel;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author joao
 */
public class OrgaoDocumentoBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private TipoDocumento selectedTipoDocumento;
    private OrgaoDocumento selectedOrgaoDocumento;
    private OrgaoDocumentoLista selectedOrgaoDocumentoLista;
    private LazyDataModel<OrgaoDocumento> lazyModel;
    private final OrgaoDocumentoEao orgaoDocumentoEAO;
    private final OrgaoDocumentoListaEao orgaoDocumentoListaEAO;
    private boolean salvar;
    private DualListModel<TipoDocumento> tipoDocumentos;
    private List<TipoDocumento> source = new ArrayList<>();
    private List<TipoDocumento> target = new ArrayList<>();
    private List<OrgaoDocumentoLista> orgaoDocumentoLista = new ArrayList<>();
    private final TipoDocumentoEao tipoocumentoEAO;
    FacesMessage msg = null;

    public OrgaoDocumentoBean() throws EaoException {
        orgaoDocumentoEAO = OrgaoDocumentoEao.getInstance();
        orgaoDocumentoListaEAO = OrgaoDocumentoListaEao.getInstance();
        tipoocumentoEAO = TipoDocumentoEao.getInstance();

        selectedOrgaoDocumento = new OrgaoDocumento();

        lazyModel = new LazyOrgaoDocumento(orgaoDocumentoEAO);

        source = tipoocumentoEAO.getNative("TipoDocumento", 0, tipoocumentoEAO.getCount("TipoDocumento"), null, true, null, null, " tip_documento = 'Proposta' ");
        tipoDocumentos = new DualListModel<TipoDocumento>(source, target);
    }

    public OrgaoDocumento getSelectedOrgaoDocumento() {
        return selectedOrgaoDocumento;
    }

    public void setSelectedOrgaoDocumento(OrgaoDocumento selectedOrgaoDocumento) {
        this.target = new ArrayList<TipoDocumento>();

        for (int i = 0; i < selectedOrgaoDocumento.getOrgaoDocumentoListaList().size(); i++) {
            selectedOrgaoDocumentoLista = selectedOrgaoDocumento.getOrgaoDocumentoListaList().get(i);
            selectedTipoDocumento = selectedOrgaoDocumentoLista.getIdDocumento();

            target.add(selectedTipoDocumento);
            source.remove(selectedTipoDocumento);
        }
        tipoDocumentos = new DualListModel<TipoDocumento>(source, target);
        this.selectedOrgaoDocumento = selectedOrgaoDocumento;
    }

    public LazyDataModel<OrgaoDocumento> getLazyModel() {
        return lazyModel;
    }

    public void setLazyModel(LazyDataModel<OrgaoDocumento> lazyModel) {
        this.lazyModel = lazyModel;
    }

    public boolean isSalvar() {
        return salvar;
    }

    public void setSalvar(boolean salvar) {
        this.salvar = salvar;
    }

    public DualListModel<TipoDocumento> getTipoDocumentos() {
        return tipoDocumentos;
    }

    public void setTipoDocumentos(DualListModel<TipoDocumento> tipoDocumentos) {
        this.tipoDocumentos = tipoDocumentos;
    }

    public void inserir(ActionEvent actionEvent) {
        msg = null;
        orgaoDocumentoLista = new ArrayList<OrgaoDocumentoLista>();

        try {
            if (Verifica_Dcoumentos()) {
                selectedOrgaoDocumento.setIdOrgao(null);

                orgaoDocumentoEAO.create(selectedOrgaoDocumento);

                for (int i = 0; i < tipoDocumentos.getTarget().size(); i++) {
                    selectedOrgaoDocumentoLista = new OrgaoDocumentoLista();

                    selectedOrgaoDocumentoLista.setIdDocumento(tipoDocumentos.getTarget().get(i));
                    selectedOrgaoDocumentoLista.setIdOrgao(selectedOrgaoDocumento);

                    orgaoDocumentoListaEAO.create(selectedOrgaoDocumentoLista);
                }

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Documentos Inseridos com Sucesso: ".concat(selectedOrgaoDocumento.getDscOrgao())), selectedOrgaoDocumento.getDscOrgao());
            } else {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... NENHUM DOCUMENTO DEFINIDO! " + selectedOrgaoDocumento.getDscOrgao(), "");
            }

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Inserir " + selectedOrgaoDocumento.getDscOrgao(), e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void alterar(ActionEvent actionEvent) {
        msg = null;

        orgaoDocumentoLista = new ArrayList<OrgaoDocumentoLista>();

        try {
            if (Verifica_Dcoumentos()) {

                for (int i = 0; i < tipoDocumentos.getTarget().size(); i++) {
                    selectedOrgaoDocumentoLista = new OrgaoDocumentoLista();

                    selectedOrgaoDocumentoLista.setIdDocumento(tipoDocumentos.getTarget().get(i));
                    selectedOrgaoDocumentoLista.setIdOrgao(selectedOrgaoDocumento);

                    orgaoDocumentoLista.add(selectedOrgaoDocumentoLista);
                }
                selectedOrgaoDocumento.setOrgaoDocumentoListaList(orgaoDocumentoLista);

                orgaoDocumentoEAO.edit(selectedOrgaoDocumento);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Documentos Alterados com Sucesso: ".concat(selectedOrgaoDocumento.getDscOrgao())), selectedOrgaoDocumento.getDscOrgao());
            } else {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... NENHUM DOCUMENTO DEFINIDO! " + selectedOrgaoDocumento.getDscOrgao(), "");
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Alterar " + selectedOrgaoDocumento.getDscOrgao(), e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void excluir(ActionEvent actionEvent) {
        msg = null;

        try {
            orgaoDocumentoEAO.destroy(selectedOrgaoDocumento);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Documentos Excluido com Sucesso: ".concat(selectedOrgaoDocumento.getDscOrgao())), selectedOrgaoDocumento.getDscOrgao());

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Ecluir " + selectedOrgaoDocumento.getDscOrgao(), e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void preparaInserir(ActionEvent event) {
        this.selectedOrgaoDocumento = new OrgaoDocumento();
        this.target = new ArrayList<TipoDocumento>();
        this.salvar = true;
    }

    public boolean Verifica_Dcoumentos() {
        boolean lReturn = true;

        if (tipoDocumentos.getTarget().isEmpty()) {
            lReturn = false;
        }

        return lReturn;
    }
}
